package com.wbase.base.logger

import android.util.Log
import com.wbase.base.app.App

/**
 * 日志工具类
 *
 * @author wangheng
 */
object Logger {
    val LOGGABLE = App.isDebug()

    private const val TAG = "Logger"

    // 下面四个是默认tag的函数
    fun i(msg: String?) {
        if (msg != null && canPrintLog(msg)) {
            Log.i(TAG, msg)
        }
    }

    fun d(msg: String?) {
        if (msg != null && canPrintLog(msg)) {
            Log.d(TAG, msg)
        }
    }

    fun e(msg: String?) {
        if (msg != null && canPrintLog(msg)) {
            Log.e(TAG, msg)
        }
    }

    fun v(msg: String?) {
        if (msg != null && canPrintLog(msg)) {
            Log.v(TAG, msg)
        }
    }

    // 下面是传入自定义tag的函数
    fun i(tag: String?, msg: String?) {
        if (msg != null && canPrintLog(msg)) {
            Log.i(tag, msg)
        }
    }

    fun d(tag: String?, msg: String?) {
        if (msg != null && canPrintLog(msg)) {
            Log.d(tag, msg)
        }
    }

    fun e(tag: String?, msg: String?) {
        if (canPrintLog(msg)) {
            Log.e(tag, msg)
        }
    }

    fun v(tag: String?, msg: String?) {
        if (msg != null && canPrintLog(msg)) {
            Log.v(tag, msg)
        }
    }

    fun e(tag: String?, logPrefix: String, throwable: Throwable) {
        if (canPrintLog("$logPrefix:$throwable")) {
            Log.e(tag, "$logPrefix:$throwable")
        }
    }

    fun longLog(tag: String?, msg: String?) {
        var message = msg
        if (tag != null && tag.isNotEmpty() && message != null && canPrintLog(message)) {
            val segmentSize = 3 * 1024
            val length = message.length.toLong()
            if (length <= segmentSize) { // 长度小于等于限制直接打印
                Log.d(tag, message)
            } else {
                while (message != null && message.length > segmentSize) { // 循环分段打印日志
                    val logContent = message.substring(0, segmentSize)
                    message = message.replace(logContent, "")
                    Log.d(tag, logContent)
                }
                if(message != null) {
                    Log.d(tag, message) // 打印剩余日志
                }
            }
        }
    }

    private fun canPrintLog(message: String?): Boolean {
        return LOGGABLE && null != message
    }
}